﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using TccServicos.Models;
using TccServicos.Util;

namespace TccServicos.Controllers
{
    public class AnimalGetController : ApiController
    {
        #region Atributos
        private string sThread = "";
        #endregion

        #region WebApis do TCC Animal Get
        [HttpGet]
        public RetornoAnimal GetAnimalId([FromUri] int? idTipo = null, [FromUri] int? idAnimal = null)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "GetAnimalId", sThread);

            try
            {
                Log.GravarLog(string.Format("{0}: id={1}", nomeFuncao, idAnimal.HasValue ? idAnimal.Value.ToString() : "0"));

                using (adoteEntities contexto = new adoteEntities())
                {
                    int abandonado = AnimalTipo.Abandonado.GetHashCode();
                    int doacao = AnimalTipo.Doacao.GetHashCode();

                    List<Animal> consulta = new List<Animal>();
                    if (idTipo.HasValue && idTipo.Equals(abandonado))
                    {

                        consulta = (from t in contexto.CADASTRO_ANIMAL_ABANDONADO.AsNoTracking()
                                         join p in contexto.CADASTRO_PESSOA.AsNoTracking() on t.ID_CADASTRO_PESSOA equals p.ID_CADASTRO_PESSOA
                                         where t.ID_CADASTRO_ABANDONADO.Equals(idAnimal.Value)
                                         select new Animal
                                         {
                                             id = t.ID_CADASTRO_ABANDONADO,
                                             animalTipoInt = abandonado,
                                             pessoa = new Pessoa()
                                             {
                                                 idPessoa = p.ID_CADASTRO_PESSOA,
                                                 nome = p.NOME,
                                             },
                                             data = t.DATA.Value,
                                             descricao = t.DESCRICAO,
                                             latitude = t.LATITUDE,
                                             longitude = t.LONGITUDE,
                                             localizacao = t.LOCALIZACAO,
                                             endereco = t.ENDERECO,
                                             fotoString = t.FOTO,
                                             DoadoRecolhido = t.RECOLHIDO,
                                         }).ToList();
                    }
                    else if (idTipo.HasValue && idTipo.Equals(doacao))
                    {
                        consulta = (from t in contexto.CADASTRO_ANIMAL.AsNoTracking()
                                         join p in contexto.CADASTRO_PESSOA.AsNoTracking() on t.ID_CADASTRO_PESSOA equals p.ID_CADASTRO_PESSOA
                                         join g in contexto.CADASTRO_GENERO.AsNoTracking() on t.ID_GENERO equals g.ID_GENERO
                                         into gt
                                         from g in gt.DefaultIfEmpty()
                                         join r in contexto.CADASTRO_RACA.AsNoTracking() on t.ID_RACA equals r.ID_RACA
                                         into rt
                                         from r in rt.DefaultIfEmpty()
                                         join po in contexto.CADASTRO_PORTE.AsNoTracking() on t.ID_PORTE equals po.ID_PORTE
                                         into pot
                                         from po in pot.DefaultIfEmpty()
                                         join uf in contexto.CADASTRO_UF.AsNoTracking() on t.ID_UF equals uf.ID_UF
                                         into uft
                                         from uf in uft.DefaultIfEmpty()
                                         join c in contexto.CADASTRO_CIDADE.AsNoTracking() on t.ID_CIDADE equals c.ID_CIDADE
                                         into ct
                                         from c in ct.DefaultIfEmpty()
                                         join foto in contexto.CADASTRO_FOTO.AsNoTracking() on t.ID_FOTO equals foto.ID_FOTO
                                         into fotot
                                         from foto in fotot.DefaultIfEmpty()
                                         where t.ID_CADASTRO_ANIMAL.Equals(idAnimal.Value)
                                         select new Animal
                                         {
                                             id = t.ID_CADASTRO_ANIMAL,
                                             animalTipoInt = doacao,
                                             pessoa = new Pessoa()
                                             {
                                                 idPessoa = p.ID_CADASTRO_PESSOA,
                                                 nome = p.NOME,
                                             },
                                             data = t.DATA,
                                             genero = new Genero()
                                             {
                                                 idGenero = g != null ? g.ID_GENERO : 0,
                                                 genero = g != null ? g.GENERO : null,
                                             },
                                             raca = new Raca()
                                             {
                                                 idRaca = r != null ? r.ID_RACA : 0,
                                                 raca = r != null ? r.RACA : null,
                                             },
                                             idade = t.IDADE,
                                             porte = new Porte()
                                             {
                                                 idPorte = po != null ? po.ID_PORTE : 0,
                                                 porte = po != null ? po.PORTE : null,
                                             },
                                             foto = new Foto()
                                             {
                                                 idFoto = foto != null ? foto.ID_FOTO : 0,
                                                 nome = foto != null ? foto.NOME : "",
                                                 tipo = foto != null ? foto.TIPO : "",
                                                 //foto = foto != null ? foto.FOTO : null,
                                                 foto = null,
                                                 fotoString = foto != null ? foto.FOTO_STRING : null,
                                             },
                                             peso = t.PESO,
                                             cidade = new Cidade()
                                             {
                                                 idCidade = c != null ? c.ID_CIDADE : 0,
                                                 uf = new Uf()
                                                 {
                                                     idUf = uf != null ? uf.ID_UF : 0,
                                                     uf = uf != null ? uf.UF : null
                                                 },
                                                 cidade = c != null ? c.CIDADE : null,
                                             },
                                             telefone = t.TELEFONE,
                                             email = t.EMAIL,
                                             descricao = t.DESCRICAO,
                                             vacinas = t.VACINAS,
                                             nome = t.NOME,
                                             DoadoRecolhido = t.DOADO,
                                         }).ToList();
                    }

                    var retorno = consulta.ToList();

                    foreach (var item in retorno)
                    {
                        item.dataFormatada = item.data.ToString("dd/MM/yy HH:mm");
                    }

                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.consultaComSucesso));

                    return new RetornoAnimal()
                    {
                        lista = retorno,
                    };
                }
            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return default(RetornoAnimal);
            }
        }
        #endregion

    }
}